package org.jenkinsci.plugins.ansible.jobdsl; import com.google.common.base.Charsets; import com.google.common.io.Resources; import hudson.model.FreeStyleProject; import javaposse.jobdsl.plugin.ExecuteDslScripts; import javaposse.jobdsl.plugin.LookupStrategy; import javaposse.jobdsl.plugin.RemovedJobAction; import javaposse.jobdsl.plugin.RemovedViewAction; import org.junit.rules.TestRule; import org.junit.runner.Description; import org.junit.runners.model.Statement; import org.jvnet.hudson.test.JenkinsRule; import java.lang.annotation.Retention; import java.lang.annotation.Target; import static java.lang.annotation.ElementType.METHOD; import static java.lang.annotation.RetentionPolicy.RUNTIME; import static org.hamcrest.Matchers.hasItem; import static org.hamcrest.Matchers.is; import static org.junit.Assert.assertThat; /** * @author lanwen (Merkushev Kirill) */ public class DslJobRule implements TestRule { public static final String JOB_NAME_IN_DSL_SCRIPT = "ansible"; private JenkinsRule jRule; private FreeStyleProject generated; public DslJobRule(JenkinsRule jRule) { this.jRule = jRule; } @Override public Statement apply(final Statement base, final Description description) { return new Statement() { @Override public void evaluate() throws Throwable { before(description); base.evaluate(); } }; } private void before(Description description) throws Exception { FreeStyleProject job = jRule.createFreeStyleProject(); String script = description.getAnnotation(WithJobDsl.class).value(); String scriptText = Resources.toString(Resources.getResource(script), Charsets.UTF_8); job.getBuildersList().add( new ExecuteDslScripts( new ExecuteDslScripts.ScriptLocation( null, null, scriptText ), false, RemovedJobAction.DELETE, RemovedViewAction.DELETE, LookupStrategy.JENKINS_ROOT ) ); jRule.buildAndAssertSuccess(job); assertThat(jRule.getInstance().getJobNames(), hasItem(is(JOB_NAME_IN_DSL_SCRIPT))); generated = jRule.getInstance().getItemByFullName(JOB_NAME_IN_DSL_SCRIPT, FreeStyleProject.class); } public FreeStyleProject getGeneratedJob() { return generated; } @Target(METHOD) @Retention(RUNTIME) public @interface WithJobDsl { String value(); } }